// package com.lj.framework.aspectj.limit;
//
// import cn.hutool.core.util.ObjectUtil;
// import com.lj.common.annotation.limit.RateLimiter;
// import com.lj.common.enums.limit.LimitTypeEnum;
// import com.lj.common.exception.ServiceException;
// import com.lj.common.utils.ServletUtil;
// import com.lj.common.utils.ip.IpUtil;
// import lombok.extern.slf4j.Slf4j;
// import org.aspectj.lang.JoinPoint;
// import org.aspectj.lang.annotation.Aspect;
// import org.aspectj.lang.annotation.Before;
// import org.aspectj.lang.reflect.MethodSignature;
// import org.springframework.data.redis.core.RedisTemplate;
// import org.springframework.data.redis.core.script.RedisScript;
// import org.springframework.stereotype.Component;
//
// import javax.annotation.Resource;
// import java.lang.reflect.Method;
// import java.util.Collections;
// import java.util.List;
//
//
// /**
//  * 限流处理
//  *
//  * @author 小李飞刀
//  */
// @Slf4j
// @Aspect
// @Component
// public class RateLimiterAspect {
//
//     private RedisTemplate<Object, Object> redisTemplate;
//
//     private RedisScript<Long> limitScript;
//
//     @Resource
//     public void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
//         this.redisTemplate = redisTemplate;
//     }
//
//     @Resource
//     public void setLimitScript(RedisScript<Long> limitScript) {
//         this.limitScript = limitScript;
//     }
//
//     @Before("@annotation(rateLimiter)")
//     public void doBefore(JoinPoint point, RateLimiter rateLimiter) {
//         String key = rateLimiter.key();
//         int time = rateLimiter.time();
//         int count = rateLimiter.count();
//
//         String combineKey = getCombineKey(rateLimiter, point);
//         List<Object> keys = Collections.singletonList(combineKey);
//         try {
//             Long number = redisTemplate.execute(limitScript, keys, count, time);
//             if (ObjectUtil.isNull(number) || number.intValue() > count) {
//                 throw new ServiceException("访问过于频繁，请稍候再试");
//             }
//             log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), key);
//         } catch (ServiceException e) {
//             throw e;
//         } catch (Exception e) {
//             throw new RuntimeException("服务器限流异常，请稍候再试");
//         }
//     }
//
//     public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) {
//         StringBuilder stringBuilder = new StringBuilder(rateLimiter.key());
//         if (rateLimiter.limitType() == LimitTypeEnum.IP) {
//             stringBuilder.append(IpUtil.getIpAddr(ServletUtil.getRequest())).append("-");
//         }
//         MethodSignature signature = (MethodSignature) point.getSignature();
//         Method method = signature.getMethod();
//         Class<?> targetClass = method.getDeclaringClass();
//         stringBuilder.append(targetClass.getName()).append("-").append(method.getName());
//         return stringBuilder.toString();
//     }
// }